《数据库系统概论》笔记六:MySQL 数据查询

作者 Marlous 日期 2018-09-10
《数据库系统概论》笔记六:MySQL 数据查询

一 数据查询知识框架

数据查询知识框架

二 数据查询

一般格式:
DISTINCT 为去掉重复列。
HAVING 为满足条件才输出。

1
2
3
4
5
SELECT [ALL|DISTINCT] <目标列表达式>,... 
FROM <表名或视图名>,...
WHERE <条件表达式>
GROUP BY <列名> HAVING <条件表达式>
ORDER BY <列名> [ASC|DESC];

1 单表查询(仅涉及一个表)

<目标列表达式> 可以为 * 星号、可以为算术表达式、字符串常量、函数等(原来没有的列会新增显示出来)。
SELECT sname,"year of birthday",2004-sage,LOWER(sdept)

  1. 常用查询条件(WHERE):
    常用查询条件

  2. 确定集合:查找属性值属于指定集合的元组。
    WHERE sdept IN("CS","MA")

  3. 字符匹配:
    [NOT] LIKE "<匹配串>" [ESCAPE "<换码字符>"]
    任意长度字符用 % ,单个字符用 _
    查询内容中有百分号或下划线须在前加 \ 转义,并加上 ESCAPE 转义符号

例:查询 cname 列以 DB_ 开头,倒数第三个字符为 i 的情况,WHERE cname LIKE "DB\_%I__" ESCAPE "\"

  1. 多重条件:
    用 AND、OR 来联结多个查询条件。

  2. 聚合函数:

    1
    2
    3
    4
    5
    6
    COUNT([DISTINCT|ALL] *) 统计元组个数
    COUNT([DISTINCT|ALL] <列名>) 统计列中值的个数
    SUM([DISTINCT|ALL] <列名>) 计算一列值的总和
    AVG([DISTINCT|ALL] <列名>) 一列平均值
    MAX([DISTINCT|ALL] <列名>) 一列中最大值
    MIN([DISTINCT|ALL] <列名>) 一列中最小值

2 连接查询

条件中使用等于号的为等值连接,其他为非等值连接;
连接中列名类型必须是可比的;
列属性名唯一可省略表名;
去掉重复列为自然连接。

  1. 等值与非等值连接:

    1
    2
    3
    4
    例:
    SELECT student.sno,sname,cno
    FROM student,course
    WHERE student.sno=course.cno;
  2. 自身连接:
    把自身虚拟为两张表操作。

1
2
3
4
例:
SELECT <虚拟表名1.列名1>,<虚拟表名2.列名2>
FROM <表名> <虚拟表名1>,<表名> <虚拟表名2>
WHERE <虚拟表名1.列名1> = <虚拟表名2.列名2>;
  1. 外连接:
    保留属性为空的元组。
    LEFT OUT JOIN 为保留左表值(表名1)。
    USING(列名) 为去掉该列重复值。

    1
    2
    3
    SELECT <列>,...
    FROM <表名1>
    LEFT OUT JOIN <表名2> ON (条件);
  2. 复合条件:
    多个条件用 AND 连接。

3 嵌套查询

一个 SELECT-FROM-WHERE 为一个查询块,将查询块嵌套在另一个查询块 WHERE 子句或 HAVING 短语条件中查询。

  1. 带有 IN 谓词的子查询(不相关子查询):

    1
    2
    3
    4
    SELECT <列名>,...
    FROM <表名>
    WHERE <列名> IN
    (一个查询块);
  2. 带有比较运算符的子查询(相关子查询例子):
    子查询的查询条件依赖于父查询。
    取外查询值传入内查询,通过内查询筛选外查询值;再接着取下一个外查询的值,循环。

    1
    2
    3
    4
    5
    6
    7
    8
    例:找出每个学生超过他选修课程的平均成绩。 // x y 是表 SC 的别名,从外查询取出 SC 的一个元组 x,将元组 x 的值传给内查询。

    SELECT sno,cno
    FROM SC x
    WHERE grade >=
    (SELECT AVG(grade)
    FROM SC y
    WHERE y.sno=x.sno);
  3. 带有 ANY、SOME、ALL 谓词的子查询:
    用 ANY、ALL 来修饰子查询结果返回值。

例:

1
2
3
> ANY 表示大于子查询结果中的某个值。
> ALL 表示大于子查询结果的全部值。
...

等价:

1
2
3
4
=ANY 等价 IN
<ANY 等价 <MAX
<> 等价 NOT IN
<ALL 等价 <MIN

  1. 带有 EXIXTS 谓词的子查询:
    带有 EXISTS 或 NOT EXISTS 的子查询不返回任何数据,只产生逻辑值 True 或 False。
    其子查询通常用 SELECT * 因为只返回真假,给出列名无意义。

4 集合查询

将多个查询块结果进行集合操作。
并:UNION、交:INTERSECT、差:EXCEPT。

1
2
3
查询块1
UNION
查询块2